package Model.Mapper;

import Model.Usuario;
import Model.Abstract.MapperAbstract;
import Model.Interface.Model;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.thoughtworks.xstream.XStream;

/**
 * Classe responsavel por salvar o Usuario no bd.
 * 
 * @author Grupo I
 * 
 */
public class UsuarioMapper extends MapperAbstract {

	/**
	 * preenche o model
	 */
	protected Usuario fillModel(File file) throws FileNotFoundException {

		XStream xstream = new XStream();

		if (file.exists() && file.isFile()) {
			Usuario model = (Usuario) xstream.fromXML(new FileReader(file));
			return model;
		}

		return null;
	}

	/**
	 * Executa antes de salvar o objeto
	 */
	@Override
	protected void beforeSave(Model model_at_action) throws Exception {
		File[] file_list = this.getFileList();

		Usuario usuario;
		for (int i = 0; i < file_list.length; i++) {

			usuario = (Usuario) this.fillModel(file_list[i]);

			if (usuario.getLogin().equals(
					((Usuario) model_at_action).getLogin()))
				throw new Exception("Login existente");
			if (usuario.getEmail().equals(
					((Usuario) model_at_action).getEmail()))
				throw new Exception("Email existente");
		}
	}

	/**
	 * Retorna o usuario a partir do seu id.
	 * 
	 * @param o
	 *            id que sera usado na pesquisa
	 * @return o usuario;
	 */
	public Usuario find(String id) throws FileNotFoundException {
		return (Usuario) super.find(id);
	}

	/**
	 * Retorna uma lista contendo todos os usuarios
	 * 
	 * @return uma lista contendo todos os usuarios
	 * @throws FileNotFoundException
	 */
	public List<Usuario> fetchAll(String class_name)
			throws FileNotFoundException {
		List<Usuario> resultado = new ArrayList<Usuario>();
		List<Model> registros = super.fetchAllAux(class_name,
				new UsuarioMapper());
		Iterator<Model> i = registros.iterator();
		while (i.hasNext()) {
			resultado.add((Usuario) i.next());
		}

		return resultado;
	}

}